const excel = require('excel4node');

const download = require('download');
const dayjs = require('dayjs');
const config = require('../../userConfig.json');

const MAX_WIDTH = 50;

const title = [
  {
    name: '序号',
    width: 5
  },
  {
    name: '发表时间',
    width: 20
  },
  {
    name: '正文内容',
    width: MAX_WIDTH
  }
];

const excelExport = () => {
  const workbook = new excel.Workbook();
  const worksheet = workbook.addWorksheet('试一下');
  const titleSyle = workbook.createStyle({
    font: {
      // 标题使用
      color: '#50878a',
      size: 12,
      bold: true
    },
    alignment: {
      wrapText: true,
      horizontal: 'center',
      vertical: 'center'
    }
  });

  const contentStyle = workbook.createStyle({
    font: {
      font: {
        size: 12
      }
    },
    alignment: {
      wrapText: true,
      horizontal: 'left',
      vertical: 'center'
    }
  });

  title.forEach((title, index) => {
    worksheet
      .cell(1, index + 1)
      .string(title.name)
      .style(titleSyle);

    worksheet.column(index + 1).setWidth(title.width);
  });

  const source = require('../../blog_list_source.json').sort((a, b) => b.created_at - a.created_at);

  const imageOk = []; // 用于判断图片是否全部下载完成
  let errCount = 0;
  console.log('开始将原始数据转为excel数据');
  source.forEach((item, index) => {
    imageOk[index] = [];

    // 第一列
    worksheet
      .cell(index + 2, 1) // 从第二行开始的,第一行是表头
      .string(index + 1 + '')
      .style(contentStyle);

    // 第二列
    worksheet
      .cell(index + 2, 2)
      .string(dayjs(item.created_at).format('YYYY-MM-DD HH:mm:ss'))
      .style(contentStyle);

    // 第三列
    worksheet
      .cell(index + 2, 3)
      .string(item.text_raw || item.text)
      .style(contentStyle);

    if (item.pic_infos) {
      worksheet.row(index + 2).setHeight(126); // 行的高度

      // 如果有图,写入第四五列
      item.pic_ids.forEach((id, i) => {
        imageOk[index][i] = false;
        // 增加表头
        worksheet
          .cell(1, i + 4)
          .string('附图' + (i + 1))
          .style(titleSyle);
        worksheet.column(i + 4).setWidth(168);

        // 下载图片
        const url = item.pic_infos[id].original.url;
        download(url, './dist', {
          timeout: {
            lookup: 10000,
            connect: 10000,
            secureConnect: 10000,
            socket: 10000,
            send: 10000,
            response: 20000
          }
        })
          .then(res => {
            console.log(`第${index + 1}条微博的第${i + 1}张附图下载成功`);
            const path = './dist/' + url.split('/').pop();
            worksheet.addImage({
              path,
              type: 'picture',
              position: {
                type: 'twoCellAnchor',
                from: {
                  col: i + 4, // 列的位置
                  colOff: 0,
                  row: index + 2, // 行的位置
                  rowOff: 0
                },
                to: {
                  col: i + 5, // 列的位置加一
                  colOff: 0,
                  row: index + 3, // 行的位置加一（说实在不知道为啥国外这么定义，下标和实标可以理解，实标和实标加一就有点...）
                  rowOff: 0
                }
              }
            });
          })
          .catch(err => {
            console.log('出错了', id);
            errCount++;
            worksheet
              .cell(index + 2, i + 4)
              .string('图片获取失败:' + url)
              .style(contentStyle);
          })
          .finally(() => {
            // 将本次标记为处理完成
            imageOk[index][i] = true;
            // 判断是否所有图片都处理完了
            const result = imageOk.flat(Infinity).every(t => t);
            if (result) {
              writeExcel();
            }
          });
      });
    }
  });

  const writeExcel = () => {
    console.log(`图片写入完成,有${errCount}张下载失败,开始写入excel`);
    const name = `${config.blogName}微博-${dayjs().format('YYYY-MM-DD HH:mm:ss')}`;
    workbook.write(`./${name}.xls`);
  };
};

module.exports = excelExport;
